﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace plust.Clases
{
    public class Venta
    {
        public int id_venta { get; set; }
        public String fecha_venta { get; set; }
        public int monto_venta { get; set; }
        public int tipo_venta { get; set; }
        public int id_factura { get; set; }
        public int id_boleta { get; set; }
        public int vuelto { get; set; }
        public List<Producto> listaProd;
        public List<int> listaCant;

        public Venta(String fecha_venta)
        {
            this.fecha_venta = fecha_venta;
            listaProd = new List<Producto>() ;
            listaCant = new List<int>();
        }

        public Venta(int id_venta, String fecha_venta, int monto_venta, int tipo_venta, int id_factura, int id_boleta)
        {
            this.id_venta = id_venta;
            this.fecha_venta = fecha_venta;
            this.monto_venta = monto_venta;
            this.tipo_venta = tipo_venta;
            this.id_factura = id_factura;
            this.id_boleta = id_boleta;

        }

        public Venta(String fecha_venta, int monto_venta, int tipo_venta, int id_factura, int id_boleta)
        {         
            this.monto_venta = monto_venta;
            this.fecha_venta = fecha_venta;
            this.tipo_venta = tipo_venta;
            this.id_factura = id_factura;
            this.id_boleta = id_boleta;
        }

        public bool ingresarProducto(Producto prod) 
        {
            if (this.listaProd.Count > 0 && this.listaProd.Find(x => x.sku == prod.sku) != null)
            { 
                var index = listaProd.FindIndex(x => x.sku == prod.sku);
                var cantold = listaCant[index];
                listaCant[index] = cantold + 1;
                monto_venta = monto_venta + int.Parse(listaProd[index].precio_venta.ToString());      
            }
            else 
            {
                listaProd.Add(prod);
                listaCant.Add(1);
                this.monto_venta = this.monto_venta + int.Parse(prod.precio_venta.ToString());
            }

            return true;
        }

        public bool ingresarProductoCantidad(Producto prod, int cantidad)
        {
            if (this.listaProd.Count > 0 && this.listaProd.Find(x => x.sku == prod.sku) != null)
            {
                if(cantidad == 1)
                {
                    var index = listaProd.FindIndex(x => x.sku == prod.sku);
                    var cantold = listaCant[index];
                    if (cantidad > cantold)
                    {
                        listaCant[index] = cantold + cantidad;
                        monto_venta = monto_venta + int.Parse(listaProd[index].precio_venta.ToString());
                    }
                    else
                    {
                        return false;
                    }       
                }
                else
                {
                    var index = listaProd.FindIndex(x => x.sku == prod.sku);
                    var cantold = listaCant[index];
                    if (cantidad > cantold)
                    {
                        listaCant[index] = cantidad;
                        monto_venta = monto_venta - (cantold * int.Parse(listaProd[index].precio_venta.ToString())) + 
                            (int.Parse(listaProd[index].precio_venta.ToString()) * (cantidad));
                    }
                    else
                    {
                        return false;
                    }         
                }
               
            }
            else 
            {
                listaProd.Add(prod);
                listaCant.Add(cantidad);
                this.monto_venta = this.monto_venta + int.Parse(prod.precio_venta.ToString());
            }

            return true;
        }

        public bool eliminarProducto(String sku, int cantidad)
        {
            if (this.listaProd.Count > 0 && this.listaProd.Find(x => x.sku == sku) != null)
            {
                var index = listaProd.FindIndex(x => x.sku == sku);
                var cantold = int.Parse(listaCant[index].ToString());
                if (cantidad < cantold)
                {
                    listaCant[index] = cantold - cantidad;
                    monto_venta -= cantidad * int.Parse(listaProd[index].precio_venta.ToString());
                    return true;
                }
                else 
                {
                    if(cantidad == cantold)
                    {
                        monto_venta -= cantidad * int.Parse(listaProd[index].precio_venta.ToString());
                        listaCant.RemoveAt(index);
                        listaProd.RemoveAt(index);
                        
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                    
                }
                
            }
                return false;
        }

        public List<FilaProducto> generarFilaProducto() 
        {
            List<FilaProducto> listaFP = new List<FilaProducto>();
            for (int i = 0; i < this.listaProd.Count; i ++ )
            {
                FilaProducto nuevo = new FilaProducto();
                nuevo.Sku = listaProd[i].sku;
                nuevo.Producto = listaProd[i].descripcion.ToString();
                nuevo.Cantidad = listaCant[i].ToString();
                nuevo.Precio = listaProd[i].precio_venta.ToString();
                listaFP.Add(nuevo);

            }

            return listaFP;
        }

        public int descuentoTotal(int valor) 
        {
            if(valor > 0)
            {
                if (valor < this.monto_venta)
                {
                    return this.monto_venta -= valor;
                }
                else 
                {
                    return -1;
                }
            }
            else
            {
                    return -1;
            }       
        }

        public int calcularVuelto(int pago) 
        {
            if(pago >= this.monto_venta)
            {
                this.vuelto = pago - this.monto_venta;
                return this.vuelto;
            }
            else
            {
                this.vuelto = 0;
                return -1;
            }
        }
    }

    public class FilaProducto
    {
        public string Sku { get; set; }
        public string Producto { get; set; }
        public string Cantidad { get; set; }
        public string Precio { get; set; }
    }
}
